/**
 * 全局事件总线
 */
class EventBus {
    private all: Map<string, any[]> // 存储事件类型与处理函数数组的映射

    constructor() {
        this.all = new Map() // 初始化事件映射表
    }

    // 注册事件监听
    public on(type: string, handler: any): void {
        const handlers = this.all.get(type) || []
        handlers.push(handler)
        this.all.set(type, handlers)
    }

    // 移除事件监听
    public off(type: string, handler?: any): void {
        const handlers = this.all.get(type)
        if (handlers) {
            if (handler) {
                handlers.splice(handlers.indexOf(handler) >>> 0, 1) // 无符号右移处理负数情况
            } else {
                this.all.set(type, []) // 清空该类型所有处理函数
            }
        }
    }

    // 触发事件
    public emit(type: string, ...args: any[]): void {
        // 处理特定类型事件
        (this.all.get(type) || []).forEach(handler => handler(...args));
        // 处理通配符事件（新增特性）
        (this.all.get('*') || []).forEach(handler => handler(type, ...args))
    }
}

export default EventBus